package fan.string.Day06.socket;

import com.sun.xml.internal.ws.server.ServerSchemaValidationTube;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 聊天室服务端
 */
public class Server {
    private ServerSocket serverSocket;

    public Server(){
        try {
            /*
                运行在服务端的ServerSocket主要有两个工作：
                1：打开服务端口，客户端就可以通过这个端口与服务端建立连接
                2：监听服务端口，一旦一个客户端与服务端建立连接就可以立即
                返回一个Socket，通关1他与客户端交互。

                我们可以吧ServerSocket想象为某客服的“总机”，所有客户端
                都可以给总机打电话，而总机下面连接着若干“电话”。
             */
            System.out.println("正在启动服务端...");
            /*
                该端口不能与系统其他应用程序已经打开的端口号一致，否则会
                抛出异常java.net.BindException:address already in use
                遇到该错误需要更换端口号，知道不报错为止。
             */
            serverSocket = new ServerSocket(8089);
            System.out.println("服务端启动完毕！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     *服务端开始工作的方法
     */
    public void start(){
        try {
            /*
                ServerSocket提供的方法：
                Socket accept（）
                此方法是一个阻塞方法，调用后服务端程序“卡住”，开始等待
                客户端的连接（相当于等待接电话），一旦一个客户端；连接了，
                此时该方法会立即返回一个Socket（相当于接起了电话）
                通过返回的Socket即可与连接的客户端进行交互。
             */
            System.out.println("等待客户端连接...");
            Socket socket = serverSocket.accept();
            System.out.println("一个客户端连接了！");

            InputStream in = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(in, "UTF-8");
            BufferedReader br = new BufferedReader(isr);
            String message = br.readLine();
            System.out.println("客户端说："+message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
}
